package br.com.vilababy.sigvb.boleto;

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;

import org.jrimum.bopepo.BancosSuportados;
import org.jrimum.bopepo.Boleto;
import org.jrimum.bopepo.view.BoletoViewer;
import org.jrimum.domkee.comum.pessoa.endereco.CEP;
import org.jrimum.domkee.comum.pessoa.endereco.Endereco;
import org.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa;
import org.jrimum.domkee.financeiro.banco.febraban.Agencia;
import org.jrimum.domkee.financeiro.banco.febraban.Carteira;
import org.jrimum.domkee.financeiro.banco.febraban.Cedente;
import org.jrimum.domkee.financeiro.banco.febraban.ContaBancaria;
import org.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta;
import org.jrimum.domkee.financeiro.banco.febraban.Sacado;
import org.jrimum.domkee.financeiro.banco.febraban.SacadorAvalista;
import org.jrimum.domkee.financeiro.banco.febraban.TipoDeMoeda;
import org.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo;
import org.jrimum.domkee.financeiro.banco.febraban.Titulo;
import org.jrimum.domkee.financeiro.banco.febraban.Titulo.Aceite;

import br.com.vilababy.sigvb.constantes.BoletoEnum;
import br.com.vilababy.sigvb.constantes.LogradouroEnum;


public class GeradorBoleto {

	public static void main(String[] args) {
		Cedente cedente = new Cedente(BoletoEnum.CEDENTE_NOME.getValor(), BoletoEnum.CEDENTE_PESSOA.getValor());
		Endereco enderecoCedente = getEndereco(LogradouroEnum.RUA.getValor() + BoletoEnum.CEDENTE_COMPLETEMENTO_ENDERECO.getValor(), 
												UnidadeFederativa.DF, 
												BoletoEnum.CEDENTE_LOCALIDADE.getValor(), 
												BoletoEnum.CEDENTE_BAIRRO.getValor(), 
												BoletoEnum.CEDENTE_CEP.getValor());
		cedente.addEndereco(enderecoCedente);
		
		Sacado sacado = new Sacado("Diego Patrick da Silva Santos", "004.252.871-22");
		
		Endereco enderecoSacado = getEndereco(LogradouroEnum.RUA.getValor() + " Alecrim Lote 6 BL.B Apto.812 Stilo Residencial Clube", 
											  UnidadeFederativa.DF, 
											  BoletoEnum.CEDENTE_LOCALIDADE.getValor(), 
											  BoletoEnum.CEDENTE_BAIRRO.getValor(), 
											  "71909-360");
		sacado.addEndereco(enderecoSacado);
		
		ContaBancaria conta = getContaBancariaCedente();
		
		SacadorAvalista avalista = new SacadorAvalista(null);
		
		Titulo titulo = getTitulo(conta, sacado, cedente, avalista, "217", "25820090000000217", "X", 1235.00, getData(31, 03, 2014), getData(10, 04, 2014));
		Boleto boleto = new Boleto(titulo);
		setInstrucaoBoleto(boleto);
		mostrarBoleto(boleto);
	}
	
	private static Carteira getCarteira() {
		Carteira carteira = new Carteira();
		carteira.setCodigo(BoletoEnum.DADOS_BANCARIOS_CARTEIRA.getNumero());
		carteira.setNome(BoletoEnum.DADOS_BANCARIOS_CARTEIRA_NOME.getValor());
		return carteira;
	}
	
	private static Titulo getTitulo(ContaBancaria conta, 
									Sacado sacado, 
									Cedente cedente, 
									SacadorAvalista avalista, 
									String numeroDocumento, 
									String nossoNumero, 
									String digitoDoNossoNumero,
									Double valor,
									Date dataDocumento,
									Date dataVencimento) {
		Titulo titulo = new Titulo(conta, sacado, cedente, avalista);
		titulo.setNumeroDoDocumento(numeroDocumento);
		titulo.setNossoNumero(nossoNumero);
		titulo.setDigitoDoNossoNumero(digitoDoNossoNumero);
		titulo.setValor(BigDecimal.valueOf(valor));
		titulo.setDataDoDocumento(dataDocumento);
		titulo.setDataDoVencimento(dataVencimento);
		titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL);
		titulo.setAceite(Aceite.N);
		titulo.setTipoDeMoeda(TipoDeMoeda.REAL);
		return titulo;
		
	}
	
	private static Date getData(int dia, int mes, int ano) {
		Calendar data = Calendar.getInstance();
		data.set(ano, --mes, dia);
		return data.getTime();
	}
	
	private static void setInstrucaoBoleto(Boleto boleto) {
		boleto.setLocalPagamento(BoletoEnum.LOCAL_PAGAMENTO.getValor());
		boleto.setInstrucao1(BoletoEnum.INSTRUCAO_UM_PARTE_A.getValor() + " 05/04/2014" + BoletoEnum.INSTRUCAO_UM_PARTE_B.getValor() + " 10/04/2014");
		boleto.setInstrucao2(BoletoEnum.INSTRUCAO_DOIS.getValor());
		boleto.setInstrucao3(BoletoEnum.INSTRUCAO_TRES_PARTE_A.getValor() + " 10/04/2014 " + BoletoEnum.INSTRUCAO_TRES_PARTE_B.getValor());
		boleto.setInstrucao4(BoletoEnum.INSTRUCAO_QUATRO.getValor() + " 10/05/2014 ");
		boleto.setInstrucao5(BoletoEnum.INSTRUCAO_CINCO_PARTE_A.getValor() + " abril " + BoletoEnum.INSTRUCAO_CINCO_PARTE_B.getValor() + " 2014");
		boleto.setInstrucao6(BoletoEnum.INSTRUCAO_SEIS.getValor() + " Cecilia Caixeta Duarte Oliveira");
	}
	
	private static Endereco getEndereco(String logradouro, UnidadeFederativa uf, String localidade, String bairro, String cep) {
		Endereco endereco = new Endereco();
		endereco.setUF(uf);
		endereco.setLocalidade(localidade);
		endereco.setCep(new CEP(cep));
		endereco.setBairro(bairro);
		endereco.setLogradouro(logradouro);
		return endereco;
	}
	
	private static ContaBancaria getContaBancariaCedente() {
		ContaBancaria conta = new ContaBancaria(BancosSuportados.BANCO_DO_BRASIL.create());
		conta.setNumeroDaConta(new NumeroDaConta(BoletoEnum.DADOS_BANCARIOS_CC.getNumero(), BoletoEnum.DADOS_BANCARIOS_CC_DIG.getValor()));
		conta.setCarteira(getCarteira());
		conta.setAgencia(new Agencia(BoletoEnum.DADOS_BANCARIOS_AG.getNumero(), BoletoEnum.DADOS_BANCARIOS_AG_DIG.getValor()));
		return conta;
	}
	
	private static void mostrarBoleto(Boleto boleto) {
		BoletoViewer viewer = new BoletoViewer(boleto);
		File arquivo = viewer.getPdfAsFile("boleto.pdf");
		
		Desktop desktop = Desktop.getDesktop();
		
		try {
			desktop.open(arquivo);
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		
	}
}
